package x.trident.core.auth;

import cn.hutool.core.util.RandomUtil;
import x.trident.core.auth.api.AuthConfigApi;
import x.trident.core.auth.api.pojo.login.LoginUser;

import java.util.ArrayList;
import java.util.List;

import static x.trident.core.auth.api.constants.AuthConstants.*;

/**
 * auth获取配置默认实现类
 *
 * @author jason.yan
 * @date 2022/6/29
 */
public class DefaultAuthConfigImpl implements AuthConfigApi {

    /**
     * 是否开启验证码登录
     * 默认值：false
     *
     * @return Boolean
     */
    @Override
    public Boolean getCaptchaOpen() {
        return false;
    }

    /**
     * 当前登录用户的加密后密码
     *
     * @return String
     */
    @Override
    public String getUserPasswordHexed() {
        return "";
    }

    /**
     * 当前用户是否为正常可以被使用的状态，即不是禁用、冻结等状态
     * 默认值：false
     *
     * @return Boolean
     */
    @Override
    public Boolean isUserStatusEnable() {
        return false;
    }

    /**
     * 获得登录用户信息类
     *
     * @return LoginUser
     */
    @Override
    public LoginUser getLoginUser() {
        return null;
    }

    /**
     * 获取不被权限控制的url
     */
    @Override
    public List<String> getNoneSecurityConfig() {
        return new ArrayList<>();
    }

    /**
     * 用于auth校验的jwt的秘钥
     * 默认返回一个随机密码
     */
    @Override
    public String getAuthJwtSecret() {
        // 默认返回一个随机密码
        return RandomUtil.randomString(20);
    }

    /**
     * 用于auth模块权限校验的jwt失效时间
     * <p>
     * 这个时间也是“记住我”功能的过期时间，默认为7天
     * <p>
     * 如果登录的时候开启了“记住我”，则用户7天内免登录
     */
    @Override
    public Long getAuthJwtTimeoutSeconds() {
        return DEFAULT_AUTH_JWT_TIMEOUT_SECONDS;
    }

    /**
     * 获取session过期时间，默认3600秒
     * <p>
     * 在这个时段内不操作，会将用户踢下线，从新登陆
     * <p>
     * 如果开启了记住我功能，在session过期后会从新创建session
     */
    @Override
    public Long getSessionExpiredSeconds() {
        return 3600L;
    }

    /**
     * 获取单账号单端登录的开关
     * <p>
     * 单账号单端登录为限制一个账号多个浏览器登录，默认：false
     *
     * @return true-开启单端限制，false-关闭单端限制
     */
    @Override
    public boolean getSingleAccountLoginFlag() {
        return false;
    }

    /**
     * 获取携带token的header头的名称，默认=Authorization
     */
    @Override
    public String getAuthTokenHeaderName() {
        return DEFAULT_AUTH_HEADER_NAME;
    }

    /**
     * 获取携带token的param传参的名称，默认=token
     */
    @Override
    public String getAuthTokenParamName() {
        return DEFAULT_AUTH_PARAM_NAME;
    }

    /**
     * 会话保存在cookie中时，cooke的name，默认=Authorization
     */
    @Override
    public String getSessionCookieName() {
        return DEFAULT_AUTH_HEADER_NAME;
    }

    /**
     * 默认解析jwt的秘钥（用于解析sso传过来的token)，默认=aabbccdd
     */
    @Override
    public String getSsoJwtSecret() {
        return SYS_AUTH_SSO_JWT_SECRET;
    }

    /**
     * 默认解析sso加密的数据的秘钥
     */
    @Override
    public String getSsoDataDecryptSecret() {
        return SYS_AUTH_SSO_DECRYPT_DATA_SECRET;
    }

    /**
     * 获取是否开启sso远程会话校验，当系统对接sso后，如需同时校验sso的会话是否存在则开启此开关
     *
     * @return true-开启远程校验，false-关闭远程校验
     */
    @Override
    public Boolean getSsoSessionValidateSwitch() {
        return SYS_AUTH_SSO_SESSION_VALIDATE_SWITCH;
    }

    /**
     * sso会话远程校验，redis的host
     */
    @Override
    public String getSsoSessionValidateRedisHost() {
        return SYS_AUTH_SSO_SESSION_VALIDATE_REDIS_HOST;
    }

    /**
     * sso会话远程校验，redis的端口
     */
    @Override
    public Integer getSsoSessionValidateRedisPort() {
        return SYS_AUTH_SSO_SESSION_VALIDATE_REDIS_PORT;
    }

    /**
     * sso会话远程校验，redis的密码
     */
    @Override
    public String getSsoSessionValidateRedisPassword() {
        return "";
    }

    /**
     * sso会话远程校验，redis的db
     */
    @Override
    public Integer getSsoSessionValidateRedisDbIndex() {
        return SYS_AUTH_SSO_SESSION_VALIDATE_REDIS_DB_INDEX;
    }

    /**
     * sso会话远程校验，redis的缓存前缀
     */
    @Override
    public String getSsoSessionValidateRedisCachePrefix() {
        return SYS_AUTH_SSO_SESSION_VALIDATE_REDIS_CACHE_PREFIX;
    }

    /**
     * 获取SSO服务器的地址
     */
    @Override
    public String getSsoUrl() {
        return SYS_AUTH_SSO_HOST;
    }
}
